home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / rational.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  8KB  |  275 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  rational.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_RATIONAL_H
  16. #define LEDA_RATIONAL_H
  17.  
  18. #include <LEDA/Int0.h>
  19.  
  20. class LedaRational;
  21.  
  22. typedef LedaRational rational;
  23.  
  24.  
  25. class LedaRational
  26. {
  27.  
  28. protected:
  29.   Int num; // numerator
  30.   Int den; // denominator, always nonzero and positive
  31.  
  32.   LedaRational& normalize();
  33.  
  34. public:
  35.   LedaRational();
  36.   LedaRational(double);
  37.   LedaRational(int);
  38.   LedaRational(int, int);
  39.   LedaRational(const Int&);
  40.   LedaRational(const Int&, const Int&);
  41.   LedaRational(const LedaRational&);
  42.  
  43.   ~LedaRational();
  44.  
  45.   LedaRational& operator= (const LedaRational&);
  46.  
  47.   LedaRational& operator+= (const LedaRational&);
  48.   LedaRational& operator-= (const LedaRational&);
  49.   LedaRational& operator*= (const LedaRational&);
  50.   LedaRational& operator/= (const LedaRational&);
  51.  
  52.   LedaRational& operator++ ();
  53.   LedaRational& operator-- ();
  54.  
  55.   const Int& numerator() const;
  56.   const Int& denominator() const;
  57.  
  58.   void negate(); // negate in place
  59.   void invert(); // invert in place
  60.   LedaRational inverse();  // returns the inverse
  61.  
  62.  
  63.  
  64. // friend functions, first arithmetic operators
  65.  
  66.   friend LedaRational operator+ (LedaRational, const LedaRational&);
  67.   friend LedaRational operator- (LedaRational, const LedaRational&);
  68.   friend LedaRational operator* (LedaRational, const LedaRational&);
  69.   friend LedaRational operator/ (LedaRational, const LedaRational&);
  70.  
  71.  
  72. // unary minus 
  73.  
  74.   friend LedaRational operator- (const LedaRational&);
  75.  
  76.  
  77. // comparison operators
  78.  
  79. friend int compare(const LedaRational& x, const LedaRational& y)
  80.   { int xsign = sign(x.num);
  81.     int ysign = sign(y.num);
  82.     if (xsign == 0) return -ysign;
  83.     if (ysign == 0) return xsign;
  84.     // now (x != 0) && (y != 0)
  85.     int diff = xsign - ysign;
  86.     if (diff == 0) 
  87.     { Int leftop  = x.num * y.den;
  88.       Int rightop = y.num * x.den;
  89.       if (leftop < rightop) return -1;
  90.       else return leftop > rightop;
  91.      }
  92.     else return diff;
  93.   }
  94.  
  95.   friend int compare(const LedaRational&, int);
  96.   friend int compare(int, const LedaRational&);
  97.  
  98.   friend bool operator== (const LedaRational&, const LedaRational&);
  99.   friend bool operator== (const LedaRational&, int);
  100.   friend bool operator== (int, const LedaRational&);
  101.   friend bool operator!= (const LedaRational&, const LedaRational&);
  102.   friend bool operator!= (const LedaRational&, int);
  103.   friend bool operator!= (int, const LedaRational&);
  104.   friend bool operator< (const LedaRational&, const LedaRational&);
  105.   friend bool operator< (const LedaRational&, int);
  106.   friend bool operator< (int, const LedaRational&);
  107.   friend bool operator<= (const LedaRational&, const LedaRational&);
  108.   friend bool operator<= (const LedaRational&, int);
  109.   friend bool operator<= (int, const LedaRational&);
  110.   friend bool operator> (const LedaRational&, const LedaRational&);
  111.   friend bool operator> (const LedaRational&, int);
  112.   friend bool operator> (int, const LedaRational&);
  113.   friend bool operator>= (const LedaRational&, const LedaRational&);
  114.   friend bool operator>= (const LedaRational&, int);
  115.   friend bool operator>= (int, const LedaRational&);
  116.  
  117.  
  118. // other friend functions
  119.  
  120.   friend int sign(const LedaRational&);
  121.   friend LedaRational abs(const LedaRational&);
  122.   friend LedaRational sqr(LedaRational);
  123.   friend LedaRational pow(const LedaRational&, int); 
  124.   friend LedaRational pow(const LedaRational&, Int); 
  125.   friend Int trunc(const LedaRational&);
  126.   friend Int floor(const LedaRational&);
  127.   friend Int ceil(const LedaRational&);
  128.   friend Int round(const LedaRational&);
  129.  
  130.  
  131. // comparison functions
  132.  
  133.   friend bool LRge0(const LedaRational&);
  134.   friend bool LRgt0(const LedaRational&);
  135.   friend bool LRle0(const LedaRational&);
  136.   friend bool LRlt0(const LedaRational&);
  137.   friend bool LReq0(const LedaRational&);
  138.   friend bool LReq1(const LedaRational&);
  139.  
  140.  
  141. // conversion
  142.  
  143.   operator double () const; // LedaRational to double
  144.  
  145.  
  146. // input/output
  147.  
  148.   friend istream& operator>> (istream&, LedaRational&);
  149.  
  150.   friend ostream& operator<< (ostream&, const LedaRational&);
  151. };
  152.  
  153.  
  154.   inline LedaRational::LedaRational()
  155.     { num = 0; den = 1; };
  156.   inline LedaRational::LedaRational(int n)
  157.     { num = Int(n); den = 1; };
  158.   inline LedaRational::LedaRational(const Int& i)
  159.     { num = i; den = 1; };
  160.   inline LedaRational::LedaRational(const LedaRational& r)
  161.     { num = r.num; den = r.den; };
  162.  
  163.   inline LedaRational::~LedaRational()
  164.     {};
  165.  
  166.   inline LedaRational& LedaRational::operator++ ()
  167.     { num += den; return (*this).normalize(); };
  168.   inline LedaRational& LedaRational::operator-- ()
  169.     { num -= den; return (*this).normalize(); };
  170.  
  171.   inline const Int& LedaRational::numerator() const
  172.     { return num; };
  173.   inline const Int& LedaRational::denominator() const
  174.     { return den; };
  175.  
  176.  
  177.   inline void LedaRational::negate()
  178.     { num.negate(); };
  179.  
  180.   inline LedaRational operator+ (LedaRational x, const LedaRational& y)
  181.     { return x += y; };
  182.   inline LedaRational operator- (LedaRational x, const LedaRational& y)
  183.     { return x -= y; };
  184.   inline LedaRational operator* (LedaRational x, const LedaRational& y)
  185.     { return x *= y; };
  186.   inline LedaRational operator/ (LedaRational x, const LedaRational& y)
  187.     { return x /= y; };
  188.  
  189.   inline LedaRational operator- (const LedaRational& x)
  190.     { return LedaRational(-x.num,x.den); };
  191.  
  192.   inline int sign(const LedaRational& r)
  193.     { return sign(r.num); };
  194.   inline LedaRational abs(const LedaRational& r)
  195.     { if (Ige0(r.num)) { return r; } else { return -r; } };
  196.   inline LedaRational sqr(LedaRational r)
  197.   // no need to normalize since num and den are relatively prime
  198.     { r.num *= r.num; r.den *= r.den; return r; };
  199.   inline Int trunc(const LedaRational& r)
  200.     { return (r.num / r.den); };
  201.  
  202.   inline bool LRge0(const LedaRational& r)
  203.     { return (Ige0(r.num)); };
  204.   inline bool LRgt0(const LedaRational& r)
  205.     { return (Igt0(r.num)); };
  206.   inline bool LRle0(const LedaRational& r)
  207.     { return (Ile0(r.num)); };
  208.   inline bool LRlt0(const LedaRational& r)
  209.     { return (Ilt0(r.num)); };
  210.   inline bool LReq0(const LedaRational& r)
  211.     { return (Ieq0(r.num)); };
  212.   inline bool LReq1(const LedaRational& r)
  213.     { return (Ieq1(r.num)); };
  214.  
  215.   inline ostream& operator<< (ostream& s, const LedaRational& r)
  216.     {  s << r.num << "/" << r.den; return s; };
  217.  
  218.  
  219.   inline bool operator== (const LedaRational& x, const LedaRational& y)
  220.     { return ((x.num == y.num) && (x.den == y.den)); };
  221.  
  222.   inline bool operator== (const LedaRational& x, int y)
  223.     { return (Ieq1(x.den) && (x.num == Int(y))); };
  224.  
  225.   inline bool operator== (int x, const LedaRational& y)
  226.     { return (Ieq1(y.den) && (y.num == Int(x))); };
  227.  
  228.   inline bool operator!= (const LedaRational& x, const LedaRational& y)
  229.     { return ((x.num != y.num) || (x.den != y.den)); };
  230.  
  231.   inline bool operator!= (const LedaRational& x, int y)
  232.     { return (!Ieq1(x.den) || (x.num != Int(y))); };
  233.  
  234.   inline bool operator!= (int x, const LedaRational& y)
  235.     { return (!Ieq1(y.den) || (y.num != Int(x))); };
  236.  
  237.   inline bool operator< (const LedaRational& x, const LedaRational& y)
  238.     { return compare(x,y) < 0; };
  239.  
  240.   inline bool operator< (const LedaRational& x, int y)
  241.     { return compare(x,y) < 0; };
  242.  
  243.   inline bool operator< (int x,  const LedaRational& y)
  244.     { return compare(x,y) < 0; };
  245.  
  246.   inline bool operator<= (const LedaRational& x, const LedaRational& y)
  247.     { return compare(x,y) <= 0; };
  248.  
  249.   inline bool operator<= (const LedaRational& x, int y)
  250.     { return compare(x,y) <= 0; };
  251.  
  252.   inline bool operator<= (int x, const LedaRational& y)
  253.     { return compare(x,y) <= 0; };
  254.  
  255.   inline bool operator> (const LedaRational& x, const LedaRational& y)
  256.     { return compare(x,y) > 0; };
  257.  
  258.   inline bool operator> (const LedaRational& x, int y)
  259.     { return compare(x,y) > 0; };
  260.  
  261.   inline bool operator> (int x, const LedaRational& y)
  262.     { return compare(x,y) > 0; };
  263.  
  264.   inline bool operator>= (const LedaRational& x, const LedaRational& y)
  265.     { return compare(x,y) >= 0; };
  266.  
  267.   inline bool operator>= (const LedaRational& x, int y)
  268.     { return compare(x,y) >= 0; };
  269.  
  270.   inline bool operator>= (int x, const LedaRational& y)
  271.     { return compare(x,y) >= 0; };
  272.  
  273. #endif
  274.